package ca.qc.bdeb.info.pp2.tp2.application;

import ca.qc.bdeb.info.pp2.tp2.controleur.ConstantesWeb;
import java.sql.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

public class ProprieteDAO
{
    public static List<Propriete> listerPropriete(CriteresRechercheBean cr)
    {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String[] nomQuartiers = cr.getQuartiers();
        String requete = "from Propriete where 1=1";

        if (nomQuartiers != null) {
            requete += " and (quartier LIKE :quartier" + 0;

            for (int i = 0; i < nomQuartiers.length; i++)
                requete += " or quartier LIKE :quartier" + i;

            requete += ")";
        }

        if (!(cr.getPrixBas().equals("") || cr.getPrixHaut().equals("")))
            requete += " and prix between :prixBas and (:prixHaut * 1.05)";
        else if (!(cr.getPrixBas().equals("")))
            requete += " and prix >=:prixBas";
        else if (!(cr.getPrixHaut().equals("")))
            requete += " and prix <=(:prixHaut * 1.05)";
        if (!(cr.getNombreChambres().equals("")))
            requete += " and (nombreChambres=:chambres or "
                    + "(nombreChambres + nombreChambresPossibles)=:chambres)";
        if (!(cr.getNombreSallesBains().equals("")))
            requete += " and nombreSallesBains=:sallesBains";
        if (!(cr.getNombreEtages().equals("")))
            requete += " and nombreEtages=:etages";
        if (!(cr.getNombrePieces().equals("")))
            requete += " and nombrePieces=:pieces";
        if (!(cr.getAnneeConstruction().equals("")))
            requete += " and anneeConstruction between :anneeConstructionBas"
                    + " and :anneeConstructionHaut";
        if (!(cr.getTypeMaison().equals("")))
            requete += " and typeMaison=:typeMaison";
        if (!(cr.getPiscine().equals(ConstantesWeb.SELECTION_RADIO_INDIFFERENT)))
            requete += " and piscine=:piscine";
        if (!(cr.getStationnement().equals(ConstantesWeb.SELECTION_RADIO_INDIFFERENT)))
            requete += " and stationnement=:stationnement";
        if (!(cr.getSousSol().equals(ConstantesWeb.SELECTION_RADIO_INDIFFERENT)))
            requete += " and sousSol=:sousSol";
        if (!(cr.getGarage().equals(ConstantesWeb.SELECTION_RADIO_INDIFFERENT)))
            requete += " and garage=:garage";
        
        requete += " order by prix";
        
        if (cr.getOrdrePrixDecroisant() != null)
            requete += " DESC";

        Query query = session.createQuery(requete);

        if (nomQuartiers != null)
            for (int i = 0; i < nomQuartiers.length; i++)
                query.setString("quartier" + i, nomQuartiers[i] + "%");
        if (!(cr.getPrixBas().equals("")))
            query.setString("prixBas", cr.getPrixBas());
        if (!(cr.getPrixHaut().equals("")))
            query.setString("prixHaut", cr.getPrixHaut());
        if (!(cr.getNombreChambres().equals("")))
            query.setString("chambres", cr.getNombreChambres());
        if (!(cr.getNombreSallesBains().equals("")))
            query.setString("sallesBains", cr.getNombreSallesBains());
        if (!(cr.getNombreEtages().equals("")))
            query.setString("etages", cr.getNombreEtages());
        if (!(cr.getNombrePieces().equals("")))
            query.setString("pieces", cr.getNombrePieces());
        if (!(cr.getAnneeConstruction().equals(""))) {
            query.setDate("anneeConstructionBas", Date.valueOf(cr.getAnneeConstruction() + "-01-01"));
            query.setDate("anneeConstructionHaut", Date.valueOf(cr.getAnneeConstruction() + "-12-31"));
        }
        if (!(cr.getTypeMaison().equals("")))
            query.setString("typeMaison", cr.getTypeMaison());
        if (!(cr.getPiscine().equals(ConstantesWeb.SELECTION_RADIO_INDIFFERENT)))
            query.setString("piscine", cr.getPiscine());
        if (!(cr.getStationnement().equals(ConstantesWeb.SELECTION_RADIO_INDIFFERENT)))
            query.setString("stationnement", cr.getStationnement());
        if (!(cr.getSousSol().equals(ConstantesWeb.SELECTION_RADIO_INDIFFERENT)))
            query.setString("sousSol", cr.getSousSol());
        if (!(cr.getGarage().equals(ConstantesWeb.SELECTION_RADIO_INDIFFERENT)))
            query.setString("garage", cr.getGarage());

        //query.setString("codePostal", codePostal);
        return (List<Propriete>) (query.list());
    }

    public static Propriete getPropriete(int idHabitation)
    {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Propriete p = (Propriete) (session.get(Propriete.class, idHabitation));

        return p;
    }
}
